package cn.edu.swu.cly.miniwebsvr.core;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class HttpParser {       //解析http协议，解析出对象得到参数Parameter

    public static Parameter parse(InputStream inputStream) throws IOException {
        Parameter parameter = new Parameter();

        BufferedReader reader = new BufferedReader(
                new InputStreamReader(inputStream, StandardCharsets.UTF_8)
        );

        // TODO: 222024321072039/蔡礼洋
        // 1. 读取并解析 HTTP 请求行 (e.g., GET /path?param=value HTTP/1.1)
        //    - 设置 parameter.setMethod()
        //    - 设置 parameter.setUrl()，并解析出 URL 参数 (e.g., ?param=value)，存入 parameter.urlParams

        //读取行请求
        String requestLine = reader.readLine();
        if (requestLine == null || requestLine.isEmpty()) {
            throw new IOException("无效的请求行。");
        }

        //解析请求行
        String[] requestParts = requestLine.split("\\s+");
        if (requestParts.length < 3) {
            throw new IOException("请求行格式错误: " + requestLine);
        }
        // 设置请求方法
        parameter.setMethod(requestParts[0]);

        // 解析URL和参数
        String url = requestParts[1];
        int queryIndex = url.indexOf('?');
        if (queryIndex != -1) {
            // 提取URL路径
            parameter.setUrl(url.substring(0, queryIndex));
            // 解析URL参数
            String queryString = url.substring(queryIndex + 1);
            parseQueryParameters(queryString, parameter.getUrlParams());
        } else {
            // 无参数的URL
            parameter.setUrl(url);
        }

        // 2. 循环读取并解析所有 HTTP 请求头 (e.g., Host: localhost:8080)
        //    - 存入 parameter.headers

        Map<String, String> headers = new HashMap<>();
        String headerLine;
        while ((headerLine = reader.readLine()) != null && !headerLine.isEmpty()) {
            int colonIndex = headerLine.indexOf(':');
            if (colonIndex != -1) {
                String key = headerLine.substring(0, colonIndex).trim();
                String value = headerLine.substring(colonIndex + 1).trim();
                headers.put(key, value);
            }
        }
        parameter.setHeaders(headers);



        // 3. 根据请求方法 (Method) 和请求头 (Content-Length, Content-Type) 判断并读取请求体
        //    - 适用于 POST 请求，解析请求体中的参数，存入 parameter.bodyParams

        if ("POST".equalsIgnoreCase(parameter.getMethod())) {
            String contentLengthStr = headers.get("Content-Length");
            if (contentLengthStr != null && !contentLengthStr.isEmpty()) {
                try {
                    int contentLength = Integer.parseInt(contentLengthStr);
                    char[] bodyChars = new char[contentLength];
                    int bytesRead = reader.read(bodyChars, 0, contentLength);
                    if (bytesRead == contentLength) {
                        String body = new String(bodyChars, 0, bytesRead);
                        // 只处理表单类型的POST数据
                        String contentType = headers.get("Content-Type");
                        if (contentType != null && contentType.contains("application/x-www-form-urlencoded")) {
                            parseQueryParameters(body, parameter.getBodyParams());
                        }
                    }
                } catch (NumberFormatException e) {
                    throw new IOException("无效的Content-Length值");
                }
            }
        }
        return parameter;
    }

    // TODO: 222024321072039/蔡礼洋 可以添加辅助方法来简化字符串解析和 URL 解码
    /**
     * 解析查询参数（key=value&key2=value2格式）
     * @param queryString 参数字符串
     * @param params 存储参数的Map
     */
    private static void parseQueryParameters(String queryString, Map<String, String> params) throws IOException {
        if (queryString == null || queryString.isEmpty()) {
            return;
        }

        String[] paramPairs = queryString.split("&");
        for (String pair : paramPairs) {
            int eqIndex = pair.indexOf('=');
            if (eqIndex != -1) {
                String key = URLDecoder.decode(pair.substring(0, eqIndex), StandardCharsets.UTF_8.name());
                String value = URLDecoder.decode(pair.substring(eqIndex + 1), StandardCharsets.UTF_8.name());
                params.put(key, value);
            } else {
                // 处理只有键没有值的参数
                String key = URLDecoder.decode(pair, StandardCharsets.UTF_8.name());
                params.put(key, "");
            }
        }
    }


}
